home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
F2JW
/
trans
/
search.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-28
|
28KB
|
1,169 lines
//
// フランス語翻訳プログラム
// 辞書の検索部
//
#include "stdafx.h"
#include <string.h>
#include <ctype.h>
#include "f2j.h"
#include "myprot.h"
extern BOOL isChanged;
extern BOOL isAltChoice;
extern SPECIALWORD specialWordTable[];
extern ARTICLE articleTable[];
extern PRONOUN objectNounTable[];
extern PRONOUN pronounTable[];
extern VERB verbTable1[], verbTable_AN[], verbTable_OZ[];
extern VERBCHANGE verbChangeTable[];
extern PREPOSITION prepositionTable[];
extern PROADJECTIVE proadjectiveTable[];
extern PROADVERB proadverbTable[];
extern COMPARE_WORD compareTable[];
extern COMBINE combineTable[];
extern QUESTION questionTable[];
extern NUMETRIC numetricTable[];
// extern CONJUNCTION conjunctionTable[];
extern INTERJECTION interjectionTable[];
extern char *tokenPtr;
extern TOKEN *lastToken;
extern NOUN *nounTable;
extern ADJECTIVE *adjectiveTable;
extern ADVERB *adverbTable;
//
// Pass2以降に品詞分類がはっきりする単語
// de, en, le, ...など
void
ChangeToSpecial(TOKEN *p, char *s)
{
int i;
for(i = 0; specialWordTable[i].french[0]; i++) {
if(strcmp(specialWordTable[i].french, s) == 0) {
p->frPart = specialWordTable[i].frPart;
p->frAttrib = specialWordTable[i].frAttrib;
p->jpProp = JP_PROP_NONE;
p->what = &specialWordTable[i];
return;
}
}
PrintInternalError( "Internall Error <ChangeToSpecial> with <%s>\n", s);
}
BOOL
SearchSpecialWord(void)
{
int i;
for(i = 0; specialWordTable[i].french[0]; i++) {
if((specialWordTable[i].elision == TRUE
&& AmatchSE(specialWordTable[i].french))
|| (specialWordTable[i].elision != TRUE
&& AmatchS(specialWordTable[i].french))) {
if(specialWordTable[i].frShort != FR_SHORT_NONE)
PutAbbreviatedWord(specialWordTable[i].frShort);
PutChoice(specialWordTable[i].frPart,
specialWordTable[i].frAttrib,
JP_PROP_NONE,
&specialWordTable[i], FR_TENSE_NONE);
return(TRUE);
}
}
return(FALSE);
}
//
// 人称代名詞に変更
//
void
ChangeToObjectPronoun(TOKEN *p, char *s)
{
int i;
// すでに人称代名詞
if(IsObjectMatch(p, FR_PART_NOUN_OBJECT_BOTH)) {
// FR_PART_NOUN_SUBJECTなど他の可能性を消す
p->frPart = (FR_PART)(p->frPart & (FR_PART)(FR_PART_NOUN_OBJECT_BOTH | FR_PART_NOUN_RECURSIVE));
return;
}
for(i = 0; objectNounTable[i].french[0]; i++) {
if(!strcmp(objectNounTable[i].french, s)) {
ChangeToPronoun(p, &objectNounTable[i]);
isChanged = TRUE;
return;
}
}
PrintInternalError( "Internall Error <objectNounTable> with <%s>\n", s);
}
//
// 代名詞を探す(一般名詞は別)
//
void
ChangeToPronoun(TOKEN *p, char *s)
{
int i;
for(i = 0; pronounTable[i].french[0]; i++) {
if(!strcmp(pronounTable[i].french, s)) {
ChangeToPronoun(p, &pronounTable[i]);
isChanged = TRUE;
return;
}
}
PrintInternalError( "Internall Error <ChangeToPronoun> with <%s>\n", s);
}
void
ChangeToPronoun(TOKEN *p, PRONOUN *dic)
{
p->frPart = FR_PART_NONE;
p->frAttrib = dic->frAttrib;
p->jpProp = JP_PROP_NONE;
p->jpUnit = JP_UNIT_NONE;
p->jpEmphasis = JP_EMPHASIS_NONE;
p->what = dic;
p->which = NULL;
JP_PRONOUN *jpPronoun = dic->jpPronoun;
int proposed = dic->proposed;
while(proposed--) {
p->frPart = (FR_PART) (p->frPart | jpPronoun->frPart);
// p->frAttrib = (FR_ATTRIB)(p->frAttrib | jpPronoun->myFrAttrib);
p->jpProp = (JP_PROP) (p->jpProp | jpPronoun->myJpProp);
p->jpUnit = (JP_UNIT) (p->jpUnit | jpPronoun->jpUnit);
p->jpEmphasis |= jpPronoun->jpEmphasis;
jpPronoun++;
}
if(p->frPart == FR_PART_NOUN_IMPERSONAL)
p->prtControl = PRT_CONTROL_DISABLE;
}
BOOL
SearchPronoun(void)
{
int i;
for(i = 0; *(pronounTable[i].french); i++) {
if(AmatchSE(pronounTable[i].french)) {
PutChoice(FR_PART_NONE, pronounTable[i].frAttrib,
JP_PROP_NONE, NULL, FR_TENSE_NONE);
ChangeToPronoun(lastToken, &pronounTable[i]);
return(TRUE);
}
}
return(FALSE);
}
void
ChangeToVerb(TOKEN *p, char *s)
{
VERB *verbTable = verbTable1;
for( ;verbTable->original[0]; verbTable++) {
if(!strcmp(s, verbTable->original)) {
p->frPart = FR_PART_VERB_GENERAL;
p->frTense = FR_TENSE_ORIGIN;
p->frAttrib = FR_ATTRIB_NONE;
p->what = verbTable;
p->jpProp = GetMaxJpProp(verbTable);
isChanged = TRUE;
return;
}
}
PrintInternalError( "Internal Error <ChangeToVerb> with <%s>\n", s);
}
//
// 動詞を探す
//
BOOL
SearchVerb(VERB *verbTable)
{
char *savPtr = tokenPtr;
FR_ATTRIB frAttrib = FR_ATTRIB_NONE;
FR_TENSE frTense = FR_TENSE_NONE;
for( ;verbTable->original[0]; verbTable++) {
if(!Amatch(verbTable->root)) continue;
int change = verbTable->frVerbKind;
char *savPtr2 = tokenPtr;
if(change == 0 && AmatchS("")) { // voiciとか語尾変化しないもの
PutChoice(FR_PART_VERB_GENERAL, FR_ATTRIB_NONE,
GetMaxJpProp(verbTable), verbTable, FR_TENSE_ORDER);
return(TRUE);
}
if(change > 52) change++;
if(change > 37) change++;
if(change > 32) change++;
if(change > 9) change++;
if(PutAllVerbChoice(change, verbTable))
return(TRUE);
tokenPtr = savPtr2;
// 32a, 32bのように活用の種類が2つあるもの
if((change == 52+3 || change == 37+2 || change == 32+1 || change == 9)
&& PutAllVerbChoice(change+1, verbTable))
return(TRUE);
tokenPtr = savPtr;
}
return(FALSE);
}
FR_TENSE_ATTRIB frTenseAttribTable_Imperfect[6] =
{
// nousの現在形は、半過去といっしょに探す
{ FR_TENSE_PRESENT, FR_ATTRIB_NOUS },
{ FR_TENSE_IMPERFECT, (FR_ATTRIB)(FR_ATTRIB_JE | FR_ATTRIB_TU) },
{ FR_TENSE_IMPERFECT, FR_ATTRIB_IL_ELLE },
{ FR_TENSE_IMPERFECT, FR_ATTRIB_NOUS },
{ FR_TENSE_IMPERFECT, FR_ATTRIB_VOUS },
{ FR_TENSE_IMPERFECT, FR_ATTRIB_ILS}
};
char *frVerbTailTable_Imperfect[6] =
{
"ons", "ais", "ait", "ions", "iez", "aient"
};
FR_ATTRIB frAttribTable_FutureSimple[6] =
{ // nousの現在形は、単純過去といっしょに探す
FR_ATTRIB_JE,
FR_ATTRIB_TU,
FR_ATTRIB_IL_ELLE,
FR_ATTRIB_NOUS,
FR_ATTRIB_VOUS,
FR_ATTRIB_ILS,
};
char *frVerbTailTable_FutureSimple[6] =
{
"ai", "as", "a", "ons", "ez", "ont"
};
FR_TENSE_ATTRIB verbTenseAttribTable[31] = {
{ FR_TENSE_P_PAST, FR_ATTRIB_NONE }, // 過去分詞 - "e" - "s"
{ FR_TENSE_NONE, FR_ATTRIB_NONE }, // nousの現在形 - "ons"
{ FR_TENSE_FUTURE_SIMPLE, FR_ATTRIB_NONE }, // 単純未来形の語幹
{ FR_TENSE_P_PRESENT, FR_ATTRIB_NONE },
{ FR_TENSE_ORIGIN, FR_ATTRIB_NONE },
{ FR_TENSE_PRESENT, FR_ATTRIB_JE },
{ FR_TENSE_PRESENT, FR_ATTRIB_TU },
{ FR_TENSE_PRESENT, FR_ATTRIB_IL_ELLE},
// nousの現在形は、単純過去といっしょに探す
{ FR_TENSE_PRESENT, FR_ATTRIB_VOUS },
{ FR_TENSE_PRESENT, FR_ATTRIB_ILS },
{ FR_TENSE_PASSE_SIMPLE, FR_ATTRIB_JE },
{ FR_TENSE_PASSE_SIMPLE, FR_ATTRIB_TU },
{ FR_TENSE_PASSE_SIMPLE, FR_ATTRIB_IL_ELLE },
{ FR_TENSE_PASSE_SIMPLE, FR_ATTRIB_NOUS },
{ FR_TENSE_PASSE_SIMPLE, FR_ATTRIB_VOUS },
{ FR_TENSE_PASSE_SIMPLE, FR_ATTRIB_ILS },
{ FR_TENSE_SUBJUNCTIVE_PRESENT, FR_ATTRIB_JE },
{ FR_TENSE_SUBJUNCTIVE_PRESENT, FR_ATTRIB_TU },
{ FR_TENSE_SUBJUNCTIVE_PRESENT, FR_ATTRIB_IL_ELLE },
{ FR_TENSE_SUBJUNCTIVE_PRESENT, FR_ATTRIB_NOUS },
{ FR_TENSE_SUBJUNCTIVE_PRESENT, FR_ATTRIB_VOUS },
{ FR_TENSE_SUBJUNCTIVE_PRESENT, FR_ATTRIB_ILS },
{ FR_TENSE_SUBJUNCTIVE_IMPERFECT, FR_ATTRIB_JE },
{ FR_TENSE_SUBJUNCTIVE_IMPERFECT, FR_ATTRIB_TU },
{ FR_TENSE_SUBJUNCTIVE_IMPERFECT, FR_ATTRIB_IL_ELLE },
{ FR_TENSE_SUBJUNCTIVE_IMPERFECT, FR_ATTRIB_NOUS },
{ FR_TENSE_SUBJUNCTIVE_IMPERFECT, FR_ATTRIB_VOUS },
{ FR_TENSE_SUBJUNCTIVE_IMPERFECT, FR_ATTRIB_ILS },
{ FR_TENSE_ORDER, FR_ATTRIB_TU },
{ FR_TENSE_ORDER, FR_ATTRIB_NOUS },
{ FR_TENSE_ORDER, FR_ATTRIB_VOUS }
};
//
// 可能性の有る時制、すべての動詞を出力
//
BOOL
PutAllVerbChoice(int kind, VERB *verb)
{
BOOL ret = FALSE;
char *savPtr = tokenPtr;
char *nextPtr = tokenPtr;
int i;
FR_ATTRIB frAttrib = FR_ATTRIB_NONE;
FR_TENSE frTense = FR_TENSE_NONE;
// 過去分詞を先に探す
if(verbChangeTable[kind][0]
&& Amatch(verbChangeTable[kind][0])) {
if(Amatch("e")) frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_FEMALE);
if(Amatch("s")) frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_PLURAL);
if(AmatchS("")) {
PutChoice(FR_PART_VERB_GENERAL, frAttrib,
GetMaxJpProp(verb), verb, FR_TENSE_P_PAST);
nextPtr = tokenPtr;
isAltChoice = ret = TRUE;
}
}
tokenPtr = savPtr;
// nousの現在形と半過去形を探す
if(kind == 2 && AmatchS("sommes")) { // etreだけ例外
PutChoice(FR_PART_VERB_GENERAL, FR_ATTRIB_NOUS,
GetMaxJpProp(verb), verb, FR_TENSE_PRESENT);
isAltChoice = ret = TRUE;
return(TRUE);
}
frAttrib = FR_ATTRIB_NONE; frTense = FR_TENSE_NONE;
if(verbChangeTable[kind][1]
&& Amatch(verbChangeTable[kind][1])) {
char *savPtr2 = tokenPtr;
for(i = 0; i < 6; i++) {
tokenPtr = savPtr2;
if(AmatchS(frVerbTailTable_Imperfect[i])) {
PutChoice(FR_PART_VERB_GENERAL,
frTenseAttribTable_Imperfect[i].frAttrib,
GetMaxJpProp(verb), verb,
frTenseAttribTable_Imperfect[i].frTense);
nextPtr = tokenPtr;
tokenPtr = savPtr;
isAltChoice = ret = TRUE;
break;
}
}
}
// 単純未来形/条件法現在形を探す
tokenPtr = savPtr;
if(verbChangeTable[kind][2]
&& Amatch(verbChangeTable[kind][2])) {
for(i = 0; i < 6; i++) { // 単純未来
if(AmatchS(frVerbTailTable_FutureSimple[i])) {
PutChoice(FR_PART_VERB_GENERAL,
frAttribTable_FutureSimple[i],
GetMaxJpProp(verb), verb,
FR_TENSE_FUTURE_SIMPLE);
nextPtr = tokenPtr;
tokenPtr = savPtr;
isAltChoice = ret = TRUE;
break;
}
}
for(i = 1; i < 6; i++) { // 条件法現在形 i = 0 -> nousの現在形なのでとばす
if(AmatchS(frVerbTailTable_Imperfect[i])) {
PutChoice(FR_PART_VERB_GENERAL,
frTenseAttribTable_Imperfect[i].frAttrib,
GetMaxJpProp(verb), verb,
FR_TENSE_CONDITIONAL_PRESENT);
nextPtr = tokenPtr;
tokenPtr = savPtr;
isAltChoice = ret = TRUE;
break;
}
}
}
// 現在分詞を探す
frAttrib = FR_ATTRIB_NONE;
tokenPtr = savPtr;
if(verbChangeTable[kind][3]
&& Amatch(verbChangeTable[kind][3])) {
if(Amatch("e")) frAttrib = FR_ATTRIB_FEMALE;
if(Amatch("s")) frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_PLURAL);
if(AmatchS("")) {
nextPtr = tokenPtr;
PutChoice(FR_PART_VERB_GENERAL, frAttrib,
GetMaxJpProp(verb), verb, FR_TENSE_P_PRESENT);
isAltChoice = ret = TRUE;
}
}
frAttrib = FR_ATTRIB_NONE; frTense = FR_TENSE_NONE;
// je chante, il chanteのような場合、全ての組み合わせを探す
for(i = 4; i < sizeof(VERBCHANGE) / sizeof(char *); i++) {
tokenPtr = savPtr;
if(verbChangeTable[kind][i]
&& AmatchS(verbChangeTable[kind][i])) {
nextPtr = tokenPtr;
frAttrib = (FR_ATTRIB)(frAttrib | verbTenseAttribTable[i].frAttrib);
frTense = (FR_TENSE)(frTense | verbTenseAttribTable[i].frTense);
}
}
if(frTense
&& kind == 3
&& !strncmp(savPtr, "es-", 3)) {
// aime. -> aime<s>-en, aime<s>-y
frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_TU);
frTense = (FR_TENSE)(frTense | FR_TENSE_ORDER);
}
if(frTense) {
PutChoice(FR_PART_VERB_GENERAL, frAttrib,
GetMaxJpProp(verb), verb, frTense);
isAltChoice = ret = TRUE;
}
tokenPtr = nextPtr;
return(ret);
}
void
PrintOutVerbList(void)
{
VERB *p;
for(p = verbTable1; p->original[0]; p++) {
FrnPrintf("%s\n", p->original);
}
for(p = verbTable_AN; p->original[0]; p++) {
FrnPrintf("%s\n", p->original);
}
for(p = verbTable_OZ; p->original[0]; p++) {
FrnPrintf("%s\n", p->original);
}
}
JP_PROP
GetMaxJpProp(VERB *verb)
{
const JP_VERB *jpVerb = verb->jpVerb;
int proposed = verb->proposed;
JP_PROP ret = JP_PROP_NONE;
while(proposed-- > 0) {
ret |= jpVerb->myJpProp;
jpVerb++;
}
// JP_PROP_NEGATIVE, JP_PROP_PASSIVE等を外す
ret = ret * JP_PROP_ALL;
return(ret);
}
//
// 冠詞を探す
//
void
ChangeToArticle(TOKEN *p, char *s)
{
int i;
for(i = 0; i < articleTable[i].french[0]; i++) {
if(!strcmp(articleTable[i].french, s)) {
p->frPart = articleTable[i].frPart;
p->frAttrib = articleTable[i].frAttrib;
p->jpProp = JP_PROP_NONE;
p->what = &articleTable[i];
isChanged = TRUE;
return;
}
}
PrintInternalError( "Internal Error <CahgenToArticle>\n");
}
BOOL
SearchArticle(void)
{
int i;
for(i = 0; i < articleTable[i].french[0]; i++) {
if(AmatchSE(articleTable[i].french)) {
if(articleTable[i].frShort != FR_SHORT_NONE)
PutAbbreviatedWord(articleTable[i].frShort);
PutChoice(articleTable[i].frPart,
articleTable[i].frAttrib,
JP_PROP_NONE,
&articleTable[i], FR_TENSE_NONE);
return(TRUE);
}
}
return(FALSE);
}
//
// 縮略された単語を復活
//
void
PutAbbreviatedWord(FR_SHORT frShort)
{
if(frShort == FR_SHORT_A) {
PutChoice(FR_PART_PREPOSIT_A, FR_ATTRIB_NONE, JP_PROP_NONE, NULL, FR_TENSE_NONE);
ChangeToPreposition(lastToken, "@");
}
if(frShort == FR_SHORT_DE) {
// PutChoice(FR_PART_PREPOSIT_DE, FR_ATTRIB_NONE, JP_PROP_NONE, NULL, FR_TENSE_NONE);
// ChangeToPreposition(lastToken, "de");
PutChoice(FR_PART_SPECIAL_DE, FR_ATTRIB_NONE, JP_PROP_NONE, NULL, FR_TENSE_NONE);
ChangeToSpecial(lastToken, "de");
}
}
//
// 名詞を探す
//
void
ChangeToNoun(TOKEN *p, char *s)
{
FR_ATTRIB frAttrib;
NOUN *q = SearchNoun(s, &frAttrib);
if(q) {
p->frPart = FR_PART_NOUN_GENERAL;
p->frAttrib = frAttrib,
p->jpProp = GetNounMaxJpProp(q);
p->what = q;
// とりあえず、一番つぶしが効くものを。
int proposed = __max(0, q->proposed-1);
p->which = &q->jpNoun[proposed];
p->jpUnit = q->jpNoun[proposed].jpUnit;
return;
}
PrintInternalError( "Internal Error <ChangeToNoun>\n");
}
NOUN
*SearchNoun(char *s, FR_ATTRIB *frAttrib)
{
NOUN *q = nounTable;
CMP_WORD cmp;
tokenPtr = s;
// Binary Search
while(q) {
cmp = CompareNoun(q->french, q->frChange);
if(cmp & CMP_WORD_LEFT) { q = q->left; continue; }
if(cmp & CMP_WORD_RIGHT){ q = q->right; continue; }
*frAttrib = (FR_ATTRIB)(q->frAttrib | FR_ATTRIB_LEVEL3);
if(cmp & CMP_WORD_PLURAL) {
*frAttrib = (FR_ATTRIB)(*frAttrib & (~FR_ATTRIB_SINGLE));
*frAttrib = (FR_ATTRIB)(*frAttrib | FR_ATTRIB_PLURAL);
}
if(!(*frAttrib & FR_ATTRIB_PLURAL)) {
// 複数形でないものは、全て単数形
*frAttrib = (FR_ATTRIB)(*frAttrib | FR_ATTRIB_SINGLE);
}
if(cmp & CMP_WORD_FEMALE) { // 語尾に'e'が付いていた
*frAttrib = (FR_ATTRIB)(*frAttrib & (~FR_ATTRIB_MALE));
*frAttrib = (FR_ATTRIB)(*frAttrib | FR_ATTRIB_FEMALE);
}
return(q);
}
return(NULL);
}
BOOL
SearchNoun(void)
{
FR_ATTRIB frAttrib;
NOUN *q = nounTable;
CMP_WORD cmp;
// Binary Search
while(q) {
cmp = CompareNoun(q->french, q->frChange);
if(cmp & CMP_WORD_LEFT) { q = q->left; continue; }
if(cmp & CMP_WORD_RIGHT){ q = q->right; continue; }
frAttrib = (FR_ATTRIB)(q->frAttrib | FR_ATTRIB_LEVEL3);
if(cmp & CMP_WORD_PLURAL) {
frAttrib = (FR_ATTRIB)(frAttrib & (~FR_ATTRIB_SINGLE));
frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_PLURAL);
}
if(!(frAttrib & FR_ATTRIB_PLURAL)) {
// 複数形でないものは、全て単数形
frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_SINGLE);
}
if(cmp & CMP_WORD_FEMALE) { // 語尾に'e'が付いていた
frAttrib = (FR_ATTRIB)(frAttrib & (~FR_ATTRIB_MALE));
frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_FEMALE);
}
PutChoice(FR_PART_NOUN_GENERAL,
frAttrib,
GetNounMaxJpProp(q),
q,
FR_TENSE_NONE);
// とりあえず、一番つぶしが効くものを。
int proposed = __max(0, q->proposed-1);
lastToken->which = &q->jpNoun[proposed];
// 本当は、選んだ方がちゃんと良いでしょうね
lastToken->jpUnit = q->jpNoun[proposed].jpUnit;
return(TRUE);
}
return(FALSE);
}
JP_PROP
GetNounMaxJpProp(NOUN *p)
{
JP_PROP jpProp = JP_PROP_NONE;
int i, proposed = p->proposed;
for(i = 0; i < proposed; i++) {
jpProp = (JP_PROP)(jpProp | p->jpNoun[i].jpProp);
}
return(jpProp);
}
//
// 形容詞を探す
//
void
ChangeToProadjective(TOKEN *p, char *s)
{
int i;
for(i = 0; proadjectiveTable[i].french[0]; i++) {
if(!strcmp(proadjectiveTable[i].french, s)) {
ChangeToProadjective(p, &proadjectiveTable[i]);
return;
}
}
PrintInternalError( "Internal Error <ChangeToProadjective> with <%s>\n", s);
}
void
ChangeToProadjective(TOKEN *p, PROADJECTIVE *dic)
{
p->frPart = GetMaxProadjectiveFrPart(dic);
p->frAttrib = dic->frAttrib;
p->jpProp = JP_PROP_CONDITION;
p->what = dic;
isChanged = TRUE;
}
FR_PART
GetMaxProadjectiveFrPart(PROADJECTIVE *proadjective)
{
JP_PROADJECTIVE *jpProadjective = proadjective->jpProadjective;
int proposed = proadjective->proposed;
FR_PART frPart = FR_PART_NONE;
while(proposed-- > 0) {
frPart = (FR_PART)(frPart | jpProadjective->frPart);
jpProadjective++;
}
return(frPart);
}
BOOL
SearchProadjective(void )
{
int i;
for(i = 0; proadjectiveTable[i].french[0]; i++) {
if(AmatchS(proadjectiveTable[i].french)) {
PutChoice(GetMaxProadjectiveFrPart(&proadjectiveTable[i]),
proadjectiveTable[i].frAttrib,
JP_PROP_CONDITION,
&proadjectiveTable[i],
FR_TENSE_NONE);
lastToken->frPartChoice = FR_PART_ADJECTIVE; // 名詞の目的語にはならない
return(TRUE);
}
}
return(FALSE);
}
//
// 形容詞
//
void
ChangeToAdjective(TOKEN *p, char *s)
{
char *savToken = tokenPtr;
tokenPtr = s;
ADJECTIVE *q = adjectiveTable;
// 指示(一般)代名詞の検索
// Binary Search
while(q) {
CMP_WORD cmp = CompareNoun(q->french, q->frChange);
if(cmp & CMP_WORD_LEFT) { q = q->left; continue; }
if(cmp & CMP_WORD_RIGHT){ q = q->right; continue; }
ChangeToAdjective(p, q, cmp);
break;
}
tokenPtr = savToken;
}
void
ChangeToAdjective(TOKEN *p, ADJECTIVE *dic, CMP_WORD cmp)
{
FR_ATTRIB frAttrib = dic->frAttrib;
if(cmp & CMP_WORD_PLURAL) {
frAttrib = (FR_ATTRIB)(frAttrib & (~FR_ATTRIB_SINGLE));
frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_PLURAL);
}
if(cmp & CMP_WORD_FEMALE) { // 語尾に'e'が付いていた
frAttrib = (FR_ATTRIB)(frAttrib & (~FR_ATTRIB_MALE));
frAttrib = (FR_ATTRIB)(frAttrib | FR_ATTRIB_FEMALE);
}
p->frPart = FR_PART_ADJECTIVE_GENERAL;
p->frAttrib = frAttrib;
p->jpProp = GetAdjectiveMaxJpProp(dic);
p->what = dic;
p->which = dic->jpAdjective;
isChanged = TRUE;
}
BOOL
SearchAdjective(void)
{
ADJECTIVE *q = adjectiveTable;
// 指示(一般)代名詞の検索
// Binary Search
while(q) {
CMP_WORD cmp = CompareNoun(q->french, q->frChange);
if(cmp & CMP_WORD_LEFT) { q = q->left; continue; }
if(cmp & CMP_WORD_RIGHT){ q = q->right; continue; }
PutChoice(FR_PART_ADJECTIVE_GENERAL,
FR_ATTRIB_NONE,
JP_PROP_NONE,
q,
FR_TENSE_NONE);
ChangeToAdjective(lastToken, q, cmp);
return(TRUE);
}
return(FALSE);
}
JP_PROP
GetAdjectiveMaxJpProp(ADJECTIVE *p)
{
JP_PROP jpProp = JP_PROP_NONE;
int i, proposed = p->proposed;
for(i = 0; i < proposed; i++) {
jpProp |= p->jpAdjective[i].myJpProp;
}
return(jpProp);
}
JP_ADVERB dic_jpAdverb_NE("", JP_KIND_NONE, JP_PROP_NEGATIVE, JP_PROP_ALL);
ADVERB dic_adverb_NE = { "ne", JPADVERB_DIC(&dic_jpAdverb_NE) };
//
// 副詞
//
void
ChangeToAdverb(TOKEN *p, char *s)
{
if(!strcmp(s, dic_adverb_NE.french)) {
ChangeToAdverb(p, &dic_adverb_NE);
p->frPart = FR_PART_ADVERB;
return;
}
ADVERB *q = adverbTable;
// Binary Search
while(q) {
int cmp = strcmp(s, q->french);
if(cmp < 0) { q = q->left; continue; }
if(cmp > 0) { q = q->right; continue; }
ChangeToAdverb(p, q);
return;
}
PrintInternalError( "Internal Error <ChangeToAdverb>\n");
}
void
ChangeToAdverb(TOKEN *p, ADVERB *dic)
{
p->frPart = FR_PART_ADVERB_GENERAL;
p->frAttrib = FR_ATTRIB_NONE,
p->jpProp = dic->jpAdverb[0].myJpProp;
p->what = dic;
p->which = dic->jpAdverb;
isChanged = TRUE;
}
BOOL
SearchAdverb(void)
{
if(AmatchSE(dic_adverb_NE.french)) {
PutChoice(FR_PART_ADVERB,
FR_ATTRIB_NONE,
JP_PROP_NEGATIVE,
&dic_adverb_NE,
FR_TENSE_NONE);
lastToken->which = &dic_jpAdverb_NE;
return(TRUE);
}
ADVERB *q = adverbTable;
// Binary Search
while(q) {
CMP_WORD cmp = CompareNoun(q->french, FR_CHANGE_NONE);
if(cmp & CMP_WORD_LEFT) { q = q->left; continue; }
if(cmp & CMP_WORD_RIGHT){ q = q->right; continue; }
PutChoice(FR_PART_ADVERB_GENERAL,
FR_ATTRIB_NONE,
q->jpAdverb[0].myJpProp,
q,
FR_TENSE_NONE);
// 一番無難な訳
lastToken->which = &q->jpAdverb[q->proposed - 1];
return(TRUE);
}
return(FALSE);
}
//
// 特殊な副詞を探す
//
void
ChangeToProadverb(TOKEN *p, char *s)
{
int i;
for(i = 0; proadverbTable[i].french[0]; i++) {
if(!strcmp(proadverbTable[i].french, s)) {
ChangeToProadverb(p, &proadverbTable[i]);
return;
}
}
PrintInternalError( "Internal Error <ChangeToProadverb> with <%s>\n", s);
}
JP_PROP
GetMaxJpProp(PROADVERB *adv)
{
JP_PROADVERB *jpAdv = adv->jpProadverb;
int proposed = adv->proposed;
JP_PROP ret = JP_PROP_NONE;
while(proposed-- > 0) {
ret |= jpAdv->myJpProp;
jpAdv++;
}
return(ret);
}
void
ChangeToProadverb(TOKEN *p, PROADVERB *adv)
{
p->frPart = adv->frPart;
p->frAttrib = adv->frAttrib;
p->jpProp = GetMaxJpProp(adv);
p->what = adv;
int proposed = adv->proposed;
p->which = &adv->jpProadverb[proposed - 1];
isChanged = TRUE;
}
BOOL
SearchProadverb(void )
{
int i;
for(i = 0; proadverbTable[i].french[0]; i++) {
if(AmatchS(proadverbTable[i].french)) {
PutChoice(proadverbTable[i].frPart,
proadverbTable[i].frAttrib,
GetMaxJpProp(&proadverbTable[i]),
&proadverbTable[i],
FR_TENSE_NONE);
int proposed = proadverbTable[i].proposed;
lastToken->which = &proadverbTable[i].jpProadverb[proposed - 1];
return(TRUE);
}
}
return(FALSE);
}
BOOL
SearchCompare(void)
{
int i;
for(i = 0; compareTable[i].french[0]; i++) {
if(AmatchS(compareTable[i].french)) {
PutChoice(compareTable[i].frPart,
compareTable[i].frAttrib,
JP_PROP_CONDITION,
&compareTable[i],
FR_TENSE_NONE);
if(compareTable[i].frPart & FR_PART_ADJECTIVE)
ChangeToAdjective(lastToken, compareTable[i].origin);
else if(compareTable[i].frPart == FR_PART_ADVERB_GENERAL)
ChangeToAdverb(lastToken, compareTable[i].origin);
else if(compareTable[i].frPart & FR_PART_ADVERB)
ChangeToProadverb(lastToken, compareTable[i].origin);
else PrintInternalError( "Internal Error <SearchCompare>\n");
lastToken->frPart = compareTable[i].frPart;
lastToken->frAttrib = compareTable[i].frAttrib;
return(TRUE);
}
}
return(FALSE);
}
//
// 数字を探す
//
BOOL
SearchNumetric(void)
{
int i;
char *savPtr = tokenPtr;
const static char *dummyStr = "数値";
if(isdigit(*tokenPtr)) {
int value = 0;
while(isdigit(*tokenPtr)) {
value = value * 10 + *tokenPtr++ - '0';
}
PutChoice(FR_PART_NUMETRIC_NUMBER,
FR_ATTRIB_NONE, JP_PROP_VOLUME, &dummyStr, FR_TENSE_NONE);
lastToken->value = value;
return(TRUE);
}
for(i = 0; numetricTable[i].value >= 0; i++) {
if(AmatchS(numetricTable[i].french)) {
PutChoice(numetricTable[i].frPart,
FR_ATTRIB_NONE, JP_PROP_VOLUME, &numetricTable[i], FR_TENSE_NONE);
lastToken->value = numetricTable[i].value;
lastToken->jpUnit = JP_UNIT_NONE;
return(TRUE);
}
tokenPtr = savPtr;
}
return(FALSE);
}
//
// 前置詞を探す
//
void
ChangeToPreposition(TOKEN *p, char *s)
{
for(int i = 0; prepositionTable[i].french[0]; i++) {
if(!strcmp(prepositionTable[i].french, s)) {
ChangeToPreposition(p, &prepositionTable[i]);
return;
}
}
PrintInternalError( "Internal Error <ChangeToPreposition> with <%s>\n", s);
}
void
ChangeToPreposition(TOKEN *p, PREPOSITION *dic)
{
p->frPart = dic->frPart;
p->frAttrib = FR_ATTRIB_NONE;
p->jpProp = JP_PROP_NONE;
p->what = dic;
p->frPartParent = GetMaxParentForPreposition(dic);
p->frPartChoice = (FR_PART)(FR_PART_PREPOSIT | FR_PART_OBJECT);
isChanged = TRUE;
}
BOOL
SearchPreposition(void)
{
int i;
for(i = 0; prepositionTable[i].french[0]; i++) {
if(AmatchSE(prepositionTable[i].french)) {
PutChoice(prepositionTable[i].frPart,
FR_ATTRIB_NONE,
JP_PROP_NONE,
&prepositionTable[i],
FR_TENSE_NONE);
ChangeToPreposition(lastToken, &prepositionTable[i]);
return(TRUE);
}
}
return(NULL);
}
FR_PART
GetMaxParentForPreposition(PREPOSITION *prep)
{
FR_PART frPart = FR_PART_NONE;
JP_PREPOSITION *jpPrep = prep->jpPreposition;
int proposed = prep->proposed;
while(proposed-- > 0) {
if(jpPrep->parent.frPart != FR_PART_ALL)
frPart = (FR_PART)(frPart | jpPrep->parent.frPart);
jpPrep++;
}
return(frPart);
}
void
PrintOutPrepositionList(void)
{
int i;
for(i = 0; prepositionTable[i].french[0]; i++) {
FrnPrintf("%s\n", prepositionTable[i].french);
}
}
//
// 接続詞
//
void
ChangeToCombine(TOKEN *p, char *s)
{
int i;
for(i = 0; combineTable[i].french[0]; i++) {
if(!strcmp(combineTable[i].french, s)) {
ChangeToCombine(p, &combineTable[i]);
return;
}
}
PrintInternalError( "Internal Error <ChangeToCombine> with <%s>\n", s);
}
void
ChangeToCombine(TOKEN *p, COMBINE *dic)
{
p->frPart = dic->frPart;
p->frAttrib = FR_ATTRIB_NONE;
p->jpProp = JP_PROP_NONE;
p->what = dic;
p->frTense = FR_TENSE_NONE;
isChanged = TRUE;
}
BOOL
SearchCombine(void)
{
int i;
for(i = 0; combineTable[i].french[0]; i++) {
if((combineTable[i].isSymbol && AmatchSymbol(combineTable[i].french))
||(!combineTable[i].isSymbol && AmatchS(combineTable[i].french))) {
PutChoice(combineTable[i].frPart,
FR_ATTRIB_NONE,
JP_PROP_NONE,
&combineTable[i],
FR_TENSE_NONE);
ChangeToCombine(lastToken, &combineTable[i]);
return(TRUE);
}
}
return(FALSE);
}
//
// 疑問代名詞(副詞)
//
void
ChangeToQuestion(TOKEN *p, char *s)
{
int i;
for(i = 0; questionTable[i].french[0]; i++) {
if(!strcmp(questionTable[i].french, s)) {
ChangeToQuestion(p, &questionTable[i]);
return;
}
}
PrintInternalError( "Internal Error <ChangeToQuestion>\n");
}
void
ChangeToQuestion(TOKEN *p, QUESTION *dic)
{
p->frPart = FR_PART_INTERROGATIVE_UNCLEAR;
p->frAttrib = dic->frAttrib;
p->jpProp = JP_PROP_NONE;
p->what = dic;
p->which = NULL;
p->frPartChoice = dic->frPartChoice;
p->jpUnit = JP_UNIT_NONE;
isChanged = TRUE;
}
BOOL
SearchQuestion(void)
{
int i;
for(i = 0; questionTable[i].french[0]; i++) {
if(AmatchS(questionTable[i].french)) {
PutChoice(FR_PART_INTERROGATIVE_UNCLEAR,
questionTable[i].frAttrib,
JP_PROP_NONE,
&questionTable[i],
FR_TENSE_NONE);
ChangeToQuestion(lastToken, &questionTable[i]);
return(TRUE);
}
}
return(FALSE);
}
BOOL
SearchInterjection(void)
{
int i;
for(i = 0; interjectionTable[i].french[0]; i++) {
if(AmatchS(interjectionTable[i].french)) {
PutChoice(interjectionTable[i].frPart,
FR_ATTRIB_NONE,
JP_PROP_NONE,
&interjectionTable[i],
FR_TENSE_NONE);
return(TRUE);
}
}
return(FALSE);
}
void
ChangeToInterjection(TOKEN *p, char *s)
{
int i;
for(i = 0; interjectionTable[i].french[0]; i++) {
if(!strcmp(interjectionTable[i].french, s)) {
p->frPart = interjectionTable[i].frPart;
p->frAttrib = FR_ATTRIB_NONE;
p->jpProp = JP_PROP_NONE;
p->what = &interjectionTable[i];
isChanged = TRUE;
return;
}
}
PrintInternalError( "Internal Error <ChangeToInterjection>\n");
}